# coding: utf8

import os
import collections as cll

testdir = "d:/testdir"
sub1 = "d:/testdir/subdir1"
sub2 = "d:/testdir/subdir2"
sub11 = "d:/testdir/subdir1/subdir11"
sub21 = "d:/testdir/subdir2/subdir21"
sub211 = "d:/testdir/subdir2/subdir21/subdir211"
all_dirs = (testdir, sub1, sub11, sub2, sub21, sub211)

tempfile1 = sub1 + '/temp1.txt'
tempfile2 = sub2 + "/temp2.txt"
tempfile11 = sub11 + "/temp11.txt"
tempfile21 = sub21 + "/temp21.txt"
tempfiles = [tempfile1, tempfile2, tempfile11, tempfile21]


class OsApp:

    # remove all dir befor mkdir
    @staticmethod
    def os_rmdir(dir):
        """
        调用os.rmdir、removedirs删除目录
        捕获异常FileNotFoundError
        使用os.path.isdir检测是否目录已经删除
        注意：如果目录中含有文件或子目录，不会删除！
        """
        successful = True
        try:
            print("rmdir:", dir)
            os.rmdir(dir)
        except FileNotFoundError as e:
            print(e)
            successful = False
        except OSError as e:
            print(e)
            successful = False
        except:
            print("出现不能删除目录的错误！")
            successful = False
        finally:
            print("删除目录成功" if successful else "删除目录失败")

    # remove all dir befor mkdir
    @staticmethod
    def remove_dir_files(dir):
        stat = 0
        yes1 = input("是否要删除该目录及所有文件子目录？（yes/no）")
        yes2 = input("确认要删除该目录及所有文件子目录？（yes/no）")
        if yes1 != 'yes' or yes2 != 'yes':
            print("放弃删除！")
            return
        OsApp.__remove_all_dir_files(dir)

    # 防止直接调用危险操作
    @staticmethod
    def __remove_all_dir_files(dir):
        """
        调用os.listdir遍历当前目录的文件目录
        调用os.remove删除文件
        递归调用本身删除子目录中的目录和文件
        注意：这是一个危险的操作，会造成数据丢失！！！
        """
        if not os.path.isdir(dir):
            print("dir not found:", dir)
            return
        for fname in os.listdir(dir):
            fname = os.path.join(dir, fname)
            if os.path.isdir(fname):
                print("remove subdir:", fname)
                OsApp.__remove_all_dir_files(fname)
                print("remove dir:", fname)
                os.removedirs(fname)
            if os.path.isfile(fname):
                print("remove file:", fname)
                os.remove(fname)

    # mkdir, create files
    @staticmethod
    def create_dir_files(dirs=all_dirs):
        """
        调用os.path.isdir/os.path.exist判断一个路径字符串是否是一个真实存在的目录
        调用os.path.isfile判断一个路径文件字符串是否是一个真实存在的文件
        调用os.path.getsize获取文件大小
        调用os.path.abspath获取文件绝对路径
        调用os.mkdir创建目录，
        调用open函数在创建的目录中创建文件
        """
        # 创建各个目录及子目录
        for d in dirs:
            if not os.path.isdir(d):
                print("mkdir: "+d)
                os.mkdir(d)
        # 创建文件
        for fname in tempfiles:
            if not os.path.isfile(fname):
                print("create file:", fname)
                with open(fname, "w") as f:
                    f.write("test file:"+fname)

    @staticmethod
    def os_getenv():
        """
        调用os.environ查看有关环境变量值
        调用os.getenv('PATH'),获取环境变量PATH的具体各个路径
        """
        envdict = os.environ
        print("environ dict:")
        for envkey in envdict.keys():
            print('\t', envkey, envdict[envkey])
        print("getenv('PATH'):")
        for p in os.getenv('PATH').split(";"):
            print("\t", p)

    @staticmethod
    def os_walk(path):
        """
        调用os.walk遍历一个目录及其子目录，显示所有子目录和文件
        通过计算路径名中的符号'/'或‘\\’，使用缩进'\t'显示各个子目录
        """
        print("walk dir:", path)
        print('-'*60)
        for root, dirs, files in os.walk(path):
            t1 = cll.Counter(root).get('/', 0)
            t1 += cll.Counter(root).get('\\', 0)
            t1 = 0 if t1 <= 1 else t1-1
            print("{}<{}>".format("\t"*t1, root))
            if len(dirs) > 0:
                print("{}subdirs:{}".format("\t"*t1, dirs))
            if len(files) > 0:
                print("{}files:{}".format("\t"*t1, files))

    # chdir, getcwd
    @staticmethod
    def os_chdir(path=""):
        """使用os.chdir进入目录，调用os.chdir显示当前路径"""
        if os.path.isdir(path):
            os.chdir(path)
            print("当前路径：", os.getcwd())
            return True
        else:
            print("非有效路径：{}".format(path))
            return False

    @staticmethod
    def os_listdir(path):
        """
        调用OsApp.ch_dir(path), 将当前目录设置为path
        调用os.listdir遍历往前目录（.），获取当前目前的子目录和文件
        """
        print("os.listdir({}):".format(path))
        print('-'*60)
        if OsApp.os_chdir(path):
            for f in os.listdir('.'):
                if os.path.isfile(f):
                    print("\t文件：{}(size={})".format(f, os.path.getsize(f)))
                else:
                    print("\t子目录：", f)


if __name__ == '__main__':
    os.mkdir("d:/temptemp")
    OsApp.os_rmdir("d:/temptemp")
    # OsApp.remove_dirs(testdir)
    # OsApp.create_dir_files()
    # OsApp.os_walk(testdir)
    # OsApp.os_listdir(sub21)
    # OsApp.get_env()
